<?php

/**
 * 验证码生成类
 * 使用静态方法生成具有最大字体的验证码图像
 */
class CaptchaGenerator
{ 
    /**
     * 生成增强版验证码 - 更大字体版本
     *
     * @param int $width 图像宽度
     * @param int $height 图像高度
     * @param int $length 验证码长度
     * @return void 直接输出图像
     */
    public static function generateEnhancedCaptcha($width = 120, $height = 40, $length = 4)
    {
        // 创建画布
        $image = imagecreate($width, $height);

        // 设置颜色
        $backgroundColor = imagecolorallocate($image, 255, 255, 255);
        $textColors = [
            imagecolorallocate($image, 0, 0, 0),
            imagecolorallocate($image, 30, 30, 30),
            imagecolorallocate($image, 60, 0, 0),
            imagecolorallocate($image, 0, 0, 60),
        ];

        $noiseColors = [
            imagecolorallocate($image, 120, 120, 120),
            imagecolorallocate($image, 150, 150, 150),
            imagecolorallocate($image, 180, 120, 120),
            imagecolorallocate($image, 120, 180, 120),
            imagecolorallocate($image, 120, 120, 180),
        ];

        // 填充背景
        imagefill($image, 0, 0, $backgroundColor);

        // 生成验证码
        $captcha = self::generateRandomString($length);

        // 将验证码存入session
        session_start();
        $_SESSION['captcha'] = $captcha;

        // 计算字符位置（最大化利用空间）
        $charPositions = self::calculateMaxCharPositions($width, $height, $length);

        // 添加干扰点
        for ($i = 0; $i < 50; $i++) {
            $colorIndex = mt_rand(0, count($noiseColors) - 1);
            imagesetpixel($image, mt_rand(0, $width), mt_rand(0, $height), $noiseColors[$colorIndex]);
        }

        // 添加干扰线
        for ($i = 0; $i < 10; $i++) {
            $colorIndex = mt_rand(0, count($noiseColors) - 1);
            $y1 = mt_rand(0, $height);
            $y2 = mt_rand(0, $height);
            imageline($image, 0, $y1, $width, $y2, $noiseColors[$colorIndex]);
        }

        // 绘制文字（最后绘制，确保在干扰线之上）
        self::drawMaxText($image, $captcha, $charPositions, $textColors);

        // 输出图片
        header('Content-Type: image/png');
        imagepng($image);
        imagedestroy($image);
    }

    /**
     * 计算字符位置 - 最大化字体显示
     *
     * @param int $width 图像宽度
     * @param int $height 图像高度
     * @param int $length 验证码长度
     * @return array 字符位置数组
     */
    public static function calculateMaxCharPositions($width, $height, $length)
    {
        $positions = [];

        // 使用最大字体（5号）
        $fontSize = 5;
        $charWidth = imagefontwidth($fontSize);
        $charHeight = imagefontheight($fontSize);

        // 减少重叠以增加字符可读性
        $overlap = $charWidth * 0.05; // 只重叠5%

        // 计算总宽度
        $totalWidth = ($charWidth * $length) - ($overlap * ($length - 1));

        // 起始位置（最小边距）
        $startX = max(0, ($width - $totalWidth) / 2);
        $startY = max(0, ($height - $charHeight) / 2);

        // 计算每个字符的位置
        for ($i = 0; $i < $length; $i++) {
            $x = $startX + ($i * ($charWidth - $overlap));
            // 允许更大的垂直波动以填充空间
            $y = $startY + mt_rand(-2, 2);

            $positions[] = [
                'x' => $x,
                'y' => $y,
                'width' => $charWidth,
                'height' => $charHeight
            ];
        }

        return $positions;
    }

    /**
     * 绘制最大化文字
     *
     * @param resource $image 图像资源
     * @param string $text 验证码文本
     * @param array $positions 字符位置数组
     * @param array $textColors 文本颜色数组
     * @return void
     */
    public static function drawMaxText($image, $text, $positions, $textColors)
    {
        $length = strlen($text);
        $fontSize = 5; // GD库最大字体

        // 绘制阴影效果以增强可读性
        for ($i = 0; $i < $length; $i++) {
            $pos = $positions[$i];
            
            // 绘制阴影（偏移1像素）
            $shadowColor = imagecolorallocate($image, 200, 200, 200);
            imagestring($image, $fontSize, $pos['x'] + 1, $pos['y'] + 1, $text[$i], $shadowColor);
            
            // 绘制主文字
            $charColor = $textColors[mt_rand(0, count($textColors) - 1)];
            imagestring($image, $fontSize, $pos['x'], $pos['y'], $text[$i], $charColor);
        }
    }

    /**
     * 生成随机字符串（移除易混淆字符）
     *
     * @param int $length 字符串长度
     * @return string 随机字符串
     */
    public static function generateRandomString($length = 4)
    {
        $characters = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ'; // 只使用大写字母和数字，避免混淆
        $result = '';

        for ($i = 0; $i < $length; $i++) {
            $result .= $characters[mt_rand(0, strlen($characters) - 1)];
        }

        return $result;
    }

    /**
     * 生成超大字体验证码
     *
     * @param int $width 图像宽度
     * @param int $height 图像高度
     * @param int $length 验证码长度
     * @return void 直接输出图像
     */
    public static function generateSuperLargeCaptcha($width = 160, $height = 60, $length = 4)
    {
        // 创建更大的画布
        $image = imagecreate($width, $height);

        // 设置颜色
        $backgroundColor = imagecolorallocate($image, 255, 255, 255);
        $textColors = [
            imagecolorallocate($image, 0, 0, 0),
            imagecolorallocate($image, 30, 30, 30),
            imagecolorallocate($image, 60, 0, 0),
            imagecolorallocate($image, 0, 0, 60),
        ];

        $noiseColors = [
            imagecolorallocate($image, 120, 120, 120),
            imagecolorallocate($image, 150, 150, 150),
            imagecolorallocate($image, 180, 120, 120),
            imagecolorallocate($image, 120, 180, 120),
            imagecolorallocate($image, 120, 120, 180),
        ];

        // 填充背景
        imagefill($image, 0, 0, $backgroundColor);

        // 生成验证码
        $captcha = self::generateRandomString($length);

        // 将验证码存入session
        session_start();
        $_SESSION['captcha'] = $captcha;

        // 计算字符位置（最大化利用空间）
        $charPositions = self::calculateSuperLargeCharPositions($width, $height, $length);

        // 添加较少但更明显的干扰
        for ($i = 0; $i < 30; $i++) {
            $colorIndex = mt_rand(0, count($noiseColors) - 1);
            imagesetpixel($image, mt_rand(0, $width), mt_rand(0, $height), $noiseColors[$colorIndex]);
        }

        // 添加几条粗干扰线
        for ($i = 0; $i < 5; $i++) {
            $colorIndex = mt_rand(0, count($noiseColors) - 1);
            $y1 = mt_rand(0, $height);
            $y2 = mt_rand(0, $height);
            imageline($image, 0, $y1, $width, $y2, $noiseColors[$colorIndex]);
            
            // 添加第二条平行线制造粗线效果
            imageline($image, 0, $y1+1, $width, $y2+1, $noiseColors[$colorIndex]);
        }

        // 绘制文字
        self::drawSuperLargeText($image, $captcha, $charPositions, $textColors);

        // 输出图片
        header('Content-Type: image/png');
        imagepng($image);
        imagedestroy($image);
    }

    /**
     * 计算超大字符位置
     *
     * @param int $width 图像宽度
     * @param int $height 图像高度
     * @param int $length 验证码长度
     * @return array 字符位置数组
     */
    public static function calculateSuperLargeCharPositions($width, $height, $length)
    {
        $positions = [];

        // 使用最大字体（5号）
        $fontSize = 5;
        $charWidth = imagefontwidth($fontSize);
        $charHeight = imagefontheight($fontSize);

        // 最小重叠以最大化字体显示
        $overlap = $charWidth * 0.02; // 只重叠2%

        // 计算总宽度
        $totalWidth = ($charWidth * $length) - ($overlap * ($length - 1));

        // 起始位置（几乎无边距）
        $startX = max(0, ($width - $totalWidth) / 2);
        $startY = max(0, ($height - $charHeight) / 2);

        // 计算每个字符的位置
        for ($i = 0; $i < $length; $i++) {
            $x = $startX + ($i * ($charWidth - $overlap));
            $y = $startY + mt_rand(-1, 1); // 很小的垂直波动

            $positions[] = [
                'x' => $x,
                'y' => $y,
                'width' => $charWidth,
                'height' => $charHeight
            ];
        }

        return $positions;
    }

    /**
     * 绘制超大文字
     *
     * @param resource $image 图像资源
     * @param string $text 验证码文本
     * @param array $positions 字符位置数组
     * @param array $textColors 文本颜色数组
     * @return void
     */
    public static function drawSuperLargeText($image, $text, $positions, $textColors)
    {
        $length = strlen($text);
        $fontSize = 5; // GD库最大字体

        for ($i = 0; $i < $length; $i++) {
            $pos = $positions[$i];
            
            // 绘制加粗效果
            $charColor = $textColors[mt_rand(0, count($textColors) - 1)];
            imagestring($image, $fontSize, $pos['x'], $pos['y'], $text[$i], $charColor);
            imagestring($image, $fontSize, $pos['x']+1, $pos['y'], $text[$i], $charColor);
            imagestring($image, $fontSize, $pos['x'], $pos['y']+1, $text[$i], $charColor);
        }
    }
}

// 使用增强版（比原来更大）
CaptchaGenerator::generateEnhancedCaptcha(70, 30, 4);

// 或者使用超大字体版本
//CaptchaGenerator::generateSuperLargeCaptcha(200, 80, 4);
